package cn.nyse.ktc_user.service;

import java.util.*;
import java.util.concurrent.TimeUnit;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import cn.nyse.ktc_user.entity.Follow;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.amqp.rabbit.core.RabbitMessagingTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import wfw.cn.ktc_common.unit.IdWorker;
import cn.nyse.ktc_user.dao.UserDao;
import cn.nyse.ktc_user.entity.User;

/**
 * @Description 用户 服务层
 * @author admin
 * @date 2020-10-14 17:34:43
*/
@Service
public class UserServiceImpl implements UserService{

	@Autowired
	private UserDao userDao;

	@Autowired
	private IdWorker idWorker;

	@Autowired
	RedisTemplate redisTemplate;

	@Autowired
	RabbitMessagingTemplate rabbitMessagingTemplate;

	@Autowired
	BCryptPasswordEncoder encoder;



	@Transactional
	@Override
	public void updateFansCount(String userid, Integer count) {
		userDao.updateFansCount(userid,count);
	}

	@Transactional
	@Override
	public void updateFollowCount(String userid, Integer count) {

		userDao.updateFollowCount(userid,count);

	}

	@Override
	public void sendSms(String mobile) {
		String code = RandomStringUtils.randomNumeric(6);
		StringRedisSerializer serializer = new StringRedisSerializer();
		redisTemplate.setKeySerializer(serializer);
		redisTemplate.setValueSerializer(serializer);
		Object o = redisTemplate.opsForValue().get("sms:" + mobile);
		if (o==null){
			redisTemplate.opsForValue().set("sms:"+mobile,code,60, TimeUnit.SECONDS	);
			HashMap<String, String> map = new HashMap<>();
			map.put("mobile",mobile);
			map.put("code",code);
			rabbitMessagingTemplate.convertAndSend("sms",map);
		}
	}

	@Override
	public void insertUser(User user) {
        user.setRegdate(new Date());
        user.setUpdatedate(new Date());
        user.setPassword(encoder.encode(user.getPassword()));
		user.setId(idWorker.nextId()+"");
		userDao.save(user);
	}

    @Override
    public void register(User user) {
        user.setRegdate(new Date());
        user.setUpdatedate(new Date());
        user.setId(idWorker.nextId()+"");
        userDao.save(user);

    }

    @Override
    public Page<User> findPage(int page, int size) {
	    if (page<=1){
	        page=0;
        }
        return userDao.findAll(PageRequest.of(page,size));
    }

	@Override
	public User login(String mobile, String password) {
		User user = userDao.findByMobile(mobile);
		if (user!=null&&encoder.matches(password,user.getPassword())){
			return user;
		}
		return null;
	}

	@Override
	public User findo(String id) {
		return userDao.fino(id);
	}


	/**
	* 查询全部列表
	* @return
	*/
	public List<User> findAll() {
		return userDao.findAll();
	}

	/**
	* 条件查询+分页
	* @param whereMap
	* @param page
	* @param size
	* @return
	*/
	public Page<User> findSearch(Map whereMap, int page, int size) {
		Specification<User> specification = createSpecification(whereMap);
		PageRequest pageRequest =  PageRequest.of(page-1, size);
		return userDao.findAll(specification, pageRequest);
	}

	/**
 	* 条件查询
	* @param whereMap
	* @return
	*/
	public List<User> findSearch(Map whereMap) {
		Specification<User> specification = createSpecification(whereMap);
		return userDao.findAll(specification);
	}

	/**
	* 根据ID查询实体
	* @param id
	* @return
	*/
	public User findById(String id) {
		return userDao.findById(id).get();
	}

	/**
	* 增加
	* @param user
	*/
	public void add(User user) {
		user.setId( idWorker.nextId()+"" );
		userDao.save(user);
	}

	/**
	* 修改
	* @param user
	*/
	public void update(User user) {
		userDao.save(user);
	}


	/**
	* 删除
	* @param id
	*/
	public void deleteById(String id) {
		userDao.deleteById(id);
	}

	/**
	* 动态条件构建
	* @param searchMap
	* @return
	*/
	private Specification<User> createSpecification(Map searchMap) {

		return new Specification<User>() {

			@Override
			public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
				List<Predicate> predicateList = new ArrayList<Predicate>();
				//手机号码
				if (searchMap.get("mobile")!=null && !"".equals(searchMap.get("mobile"))) {
					predicateList.add(cb.like(root.get("mobile").as(String.class), "%"+(String)searchMap.get("mobile")+"%"));
				}
				//密码
				if (searchMap.get("password")!=null && !"".equals(searchMap.get("password"))) {
					predicateList.add(cb.like(root.get("password").as(String.class), "%"+(String)searchMap.get("password")+"%"));
				}
				//昵称
				if (searchMap.get("nickname")!=null && !"".equals(searchMap.get("nickname"))) {
					predicateList.add(cb.like(root.get("nickname").as(String.class), "%"+(String)searchMap.get("nickname")+"%"));
				}
				//性别
				if (searchMap.get("sex")!=null && !"".equals(searchMap.get("sex"))) {
					predicateList.add(cb.like(root.get("sex").as(String.class), "%"+(String)searchMap.get("sex")+"%"));
				}
				//出生年月日
				if (searchMap.get("birthday")!=null && !"".equals(searchMap.get("birthday"))) {
					predicateList.add(cb.like(root.get("birthday").as(String.class), "%"+(String)searchMap.get("birthday")+"%"));
				}
				//头像
				if (searchMap.get("avatar")!=null && !"".equals(searchMap.get("avatar"))) {
					predicateList.add(cb.like(root.get("avatar").as(String.class), "%"+(String)searchMap.get("avatar")+"%"));
				}
				//E-Mail
				if (searchMap.get("email")!=null && !"".equals(searchMap.get("email"))) {
					predicateList.add(cb.like(root.get("email").as(String.class), "%"+(String)searchMap.get("email")+"%"));
				}
				//注册日期
				if (searchMap.get("regdate")!=null && !"".equals(searchMap.get("regdate"))) {
					predicateList.add(cb.like(root.get("regdate").as(String.class), "%"+(String)searchMap.get("regdate")+"%"));
				}
				//修改日期
				if (searchMap.get("updatedate")!=null && !"".equals(searchMap.get("updatedate"))) {
					predicateList.add(cb.like(root.get("updatedate").as(String.class), "%"+(String)searchMap.get("updatedate")+"%"));
				}
				//最后登陆日期
				if (searchMap.get("lastdate")!=null && !"".equals(searchMap.get("lastdate"))) {
					predicateList.add(cb.like(root.get("lastdate").as(String.class), "%"+(String)searchMap.get("lastdate")+"%"));
				}
				//在线时长（分钟）
				if (searchMap.get("online")!=null && !"".equals(searchMap.get("online"))) {
					predicateList.add(cb.like(root.get("online").as(String.class), "%"+(String)searchMap.get("online")+"%"));
				}
				//兴趣
				if (searchMap.get("interest")!=null && !"".equals(searchMap.get("interest"))) {
					predicateList.add(cb.like(root.get("interest").as(String.class), "%"+(String)searchMap.get("interest")+"%"));
				}
				//个性
				if (searchMap.get("personality")!=null && !"".equals(searchMap.get("personality"))) {
					predicateList.add(cb.like(root.get("personality").as(String.class), "%"+(String)searchMap.get("personality")+"%"));
				}
				//粉丝数
				if (searchMap.get("fanscount")!=null && !"".equals(searchMap.get("fanscount"))) {
					predicateList.add(cb.like(root.get("fanscount").as(String.class), "%"+(String)searchMap.get("fanscount")+"%"));
				}
				//关注数
				if (searchMap.get("followcount")!=null && !"".equals(searchMap.get("followcount"))) {
					predicateList.add(cb.like(root.get("followcount").as(String.class), "%"+(String)searchMap.get("followcount")+"%"));
				}

				return cb.and( predicateList.toArray(new Predicate[predicateList.size()]));
			}
		};
	}

}
